package com.sz.biz.pay.account.service;

import com.sz.biz.pay.account.dto.PayBankCardDto;
import com.sz.biz.pay.account.entity.Account;
import com.sz.biz.pay.account.entity.BankCard;
import com.sz.biz.pay.account.entity.ThirdPayAccount;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.common.base.dto.ResultDto;

import java.util.List;

/**
 * Function: TODO: ADD FUNCTION <br>
 * Author: siqishangshu <br>
 * Date: 2017-11-02 18:05:00
 */
public interface BankCardService {

    /**
     * 新增记录，返回id
     *
     * @param entry
     * @return id
     */
    int insert(BankCard entry);

    /**
     * 通过id 删除
     *
     * @param id
     * @return
     */
    int delete(String id);

    /**
     * 多id 删除多条记录
     *
     * @param ids
     * @return
     */
    int delete(List ids);

    /**
     * id 更新记录
     *
     * @param entry
     * @return boolean
     */
    int update(BankCard entry);

    /**
     * id 查找
     *
     * @param id
     * @return list
     */
    BankCard select(String id);

    /**
     * 多id 查找
     *
     * @param ids
     * @return list
     */
    List<BankCard> selectList(List ids);

    /**
     * 查询所有记录
     *
     * @return list
     */
    List<BankCard> selectAll();

    /**
     * 搜索条件查找
     *
     * @param param
     * @return QResultDto
     */
    QResultDto selectList(QueryParams param);

    /**
     * 搜索条件查找结果统计
     *
     * @param param
     * @return int
     */
    int count(QueryParams param);

    /**
     * 全表数据统计
     *
     * @return int
     */
    int countAll();

    /**
     * 根据第三方账户ID查询最近添加的银行卡信息
     *
     * @param thirdPayAccountId
     * @return
     */
    PayBankCardDto findNewestCard(String thirdPayAccountId);

    /**
     * 新增记录
     *
     * @param bankCard
     * @return
     */
    int insertSelective(BankCard bankCard);

    /**
     * 根据主键更新记录
     *
     * @param bankCard
     * @return
     */
    void updateById(BankCard bankCard);

    /**
     * 根据第三方账户ID查询所有的的银行卡信息
     *
     * @param thirdPayAccountId
     * @return
     */
    List<PayBankCardDto> findAllByThirdPayAccountId(String thirdPayAccountId);

    /**
     * 修改标记删除状态
     *
     * @param bankCard
     */
    void changeDeleteSign(BankCard bankCard);

    /**
     * 根据银行卡号更新绑定状态
     *
     * @param bankCard
     */
    void changeStatusByCardNo(BankCard bankCard);

    /**
     * 会员绑定信息查询请求
     *
     * @param thirdPayId
     * @return
     */
    ResultDto queryAccountCard(String thirdPayId);

    /**
     * 查询子账户余额请求
     *
     * @param thirdPayId
     * @return
     */
    ResultDto queryAccountBalance(String thirdPayId);

    /**
     * 查询子账户余额
     *
     * @param thirdPayId
     * @return
     */
    double getAccountBalance(String thirdPayId);

    /**
     * 会员绑定提现账户请求
     *
     * @param account         账户
     * @param thirdPayAccount 第三方账户
     * @param payBankCardDto  银行卡
     * @return
     */
    ResultDto bindAccountAuth(Account account, ThirdPayAccount thirdPayAccount, PayBankCardDto payBankCardDto);


    /**
     * 验证鉴权金额请求
     *
     * @param custAcctId
     * @param thirdCustId
     * @param acctId
     * @param tranAmount
     * @return
     */
    ResultDto bindAccountAuthQuota(String custAcctId, String thirdCustId, String acctId, String tranAmount);

    /**
     * 会员解绑提现账户请求
     *
     * @param acctId
     * @param custAcctId
     * @param thirdCustId
     * @return
     */
    ResultDto unbindCard(String acctId, String custAcctId, String thirdCustId);

    /**
     * 绑定银行卡
     *
     * @param
     */
    ResultDto bindAccountCard(PayBankCardDto payBankCardDto);

    /**
     * 验证银行卡绑定
     *
     * @param payBankCardDto
     */
    ResultDto verifyBindCard(PayBankCardDto payBankCardDto);

    /**
     * 解绑银行卡
     */
    ResultDto unbindAccountCard(String bankCardId);

    /**
     * 生成短信验证码
     *
     * @param mobilePhone
     * @return
     */
    boolean sendSms(String mobilePhone);

    /**
     * 通过银行卡号查银行卡信息
     *
     * @param bankCardNo
     * @return
     */
    BankCard getByCardNo(String custAcctId);

    /**
     * 根据第三方账户ID查询银行卡信息
     * @param thirdPayAccountId
     * @return
     */
    BankCard getByThirdPayAccountId(String thirdPayAccountId);

    /**
     * 获取已验证银行卡列表
     * @return
     */
    List<BankCard> getVerifiedCard(String thirdPayAccountId);

    /**
     * 根据第三方账户查询银行卡数量
     * @param thirdPayAccountId
     * @return
     */
    int getCardNum(String thirdPayAccountId);

    /**
     * 根据银行卡号判断银行卡是否已存在
     * @param cardNo
     * @return
     */
    ResultDto checkCardExist(String cardNo);


    //TODO

    /**
     * 查询关联的银行卡信息
     * @param thirdPayAccountId
     * @return
     */
    ResultDto getBankInfo(String thirdPayAccountId);


}
